Créer l'action
==============

Une fois qu'on a créé le modèle, on peut commencer à écrire la logique
nécessaire à la manipulation de ce modèle. Cette logique est placée au sein
d'une action d'un contrôleur. Dans l'exemple du formulaire de connexion,
on peut typiquement utiliser le code suivant:

~~~
[php]
public function actionLogin()
{
	$model=new LoginForm;
	if(isset($_POST['LoginForm']))
	{
		// récupère les données postées par l'utilisateur
		$model->attributes=$_POST['LoginForm'];
		// valide les données envoyées par l'utilisateur et
		// redirige sur la page précédente si les données sont validées.
		if($model->validate())
			$this->redirect(Yii::app()->user->returnUrl);
	}
	// affiche le formulaire de connexion
	$this->render('login',array('model'=>$model));
}
~~~

Ci-dessus, on crée tout d'abord une instance du modèle `LoginForm`; si c'est une requète
POST (signifiant que le formulaire de connexion à été soumis par l'utilisateur), on
fournit au `$model` les données soumises `$_POST['LoginForm']`; puis l'on valide ces données
et si la validation réussi, on redirige le navigateur de l'utilisateur vers la page
qui nécessitait l'authentification. Si la validation échoue, ou si l'action est accédée
pour la premiere fois, on affiche la vue `login` avec le contenu qui va être décrit dans
la section qui suit.

> Tip: Dans l'action `login`, on utilise `Yii::app()->user->returnUrl` pour récupérer
l'URL de la page qui nécessitait l'authentification. Le component `Yii::app()->user` est
de type [CWebUser] (ou une de ses classes héritées) et contient les informations sur la
session utilisateur (par exemple username, status). Pour plus de détails, voir [Authentification et autorisation](/doc/guide/topics.auth).

Regardons plus attentivement l'opération PHP suivante qui apparaît dans l'action `login`:

~~~
[php]
$model->attributes=$_POST['LoginForm'];
~~~

Comme décrit dans [Sécuriser l'assignation des attributs](/doc/guide/form.model#securing-attribute-assignments),
cette ligne de code rempli le modèle avec les données soumises par l'utilisateur.
La propriété `attributes` est définie par [CModel] qui attend un tableau de paires de noms-valeurs
et assigne chaque valeur à l'attribut correspondant dans le modèle. Ainsi si `$_POST['LoginForm']` renvoie
un tableau, le code ci-dessus serait équivalent au code beaucoup plus long ci-dessous (chaque attribut doit
être présent dans le tableau):

~~~
[php]
$model->username=$_POST['LoginForm']['username'];
$model->password=$_POST['LoginForm']['password'];
$model->rememberMe=$_POST['LoginForm']['rememberMe'];
~~~

> Note: Afin que `$_POST['LoginForm']` puisse retourner un tableau au lieu d'une chaîne de
caractères, on devra respecter une convention lors du nommage des noms des champs dans la vue.
En particulier, pour un champ correspondant à l'attribut `a` du modèle de classe `C`, on nommera celui-ci `C[a]`.
Par exemple, on utiliserait `LoginForm[username]` comme nom pour le champ correspondant à l'attribut `username`.

Il reste maintenant à créer la vue `login` qui contiendra un formulaire HTML avec les champs nécessaires.

<div class="revision">$Id: form.action.txt 1838 2013-11-20 $</div>
